
#include <cstdlib>
#include <cstdio>
#include <cassert>
#include <map>

#include "graph.h"
using namespace graph;

static bool scan_header(FILE *f, const char *str1, const char *str2) {
  char buf1[128], buf2[128];
  if (2 != fscanf(f, "%s %s\n", buf1, buf2) ||
      strcmp(buf1, str1) != 0 ||
      strcmp(buf2, str2) != 0) {
    return false;
  }

  return true;
}

int main(int argc, char *argv[]) {
  // Use predefined small dataset.
  std::vector<unsigned> nodes = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
      13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
      29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
      45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
      61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
      77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
      93, 94, 95, 96, 97, 98, 99 };

  std::vector<std::pair<std::pair<unsigned, unsigned>, double>> edges = {
    {{26, 47}, 921},
    {{20, 25}, 971},
    {{92, 59}, 250},
    {{33, 55}, 1391},
    {{78, 39}, 313},
    {{7, 25}, 637},
    {{18, 19}, 1817},
    {{33, 41}, 993},
    {{64, 41}, 926},
    {{88, 86}, 574},
    {{93, 15}, 1462},
    {{86, 33}, 1649},
    {{37, 35}, 841},
    {{98, 51}, 1160},
    {{15, 30}, 1125},
    {{65, 78}, 1052},
    {{58, 12}, 1273},
    {{12, 17}, 285},
    {{45, 61}, 1608},
    {{75, 53}, 545},
    {{99, 48}, 410},
    {{97, 0}, 1303},
    {{48, 17}, 1807},
    {{1, 54}, 1491},
    {{15, 34}, 807},
    {{94, 98}, 646},
    {{12, 69}, 136},
    {{65, 11}, 983},
    {{63, 83}, 1604},
    {{78, 89}, 1828},
    {{61, 63}, 845},
    {{18, 36}, 1626},
    {{68, 52}, 1324},
    {{14, 50}, 690},
    {{3, 11}, 943},
    {{21, 68}, 914},
    {{19, 44}, 1762},
    {{85, 80}, 270},
    {{59, 92}, 250},
    {{86, 84}, 1431},
    {{19, 18}, 1817},
    {{52, 68}, 1324},
    {{16, 29}, 1108},
    {{36, 80}, 395},
    {{67, 18}, 803},
    {{63, 88}, 1717},
    {{68, 21}, 914},
    {{75, 82}, 306},
    {{49, 82}, 1292},
    {{73, 45}, 1876},
    {{89, 82}, 409},
    {{45, 47}, 272},
    {{22, 83}, 597},
    {{61, 12}, 1791},
    {{44, 68}, 1229},
    {{50, 51}, 917},
    {{14, 53}, 355},
    {{77, 41}, 138},
    {{54, 21}, 1870},
    {{93, 70}, 1582},
    {{76, 2}, 1658},
    {{83, 73}, 1162},
    {{6, 1}, 482},
    {{11, 65}, 983},
    {{81, 90}, 1024},
    {{19, 1}, 970},
    {{8, 58}, 1131},
    {{60, 42}, 477},
    {{86, 29}, 258},
    {{69, 59}, 903},
    {{34, 15}, 807},
    {{37, 2}, 1451},
    {{7, 73}, 754},
    {{47, 86}, 184},
    {{67, 17}, 449},
    {{18, 67}, 803},
    {{25, 4}, 595},
    {{3, 31}, 1337},
    {{64, 31}, 1928},
    {{9, 43}, 237},
    {{83, 63}, 1604},
    {{47, 45}, 272},
    {{86, 88}, 574},
    {{87, 74}, 934},
    {{98, 94}, 646},
    {{20, 1}, 642},
    {{26, 92}, 1344},
    {{18, 17}, 565},
    {{47, 11}, 595},
    {{10, 59}, 1558},
    {{2, 76}, 1658},
    {{77, 74}, 1277},
    {{42, 60}, 477},
    {{80, 36}, 395},
    {{35, 23}, 589},
    {{50, 37}, 203},
    {{6, 96}, 481},
    {{78, 65}, 1052},
    {{1, 52}, 127},
    {{65, 23}, 1932},
    {{46, 51}, 213},
    {{59, 89}, 89},
    {{15, 93}, 1462},
    {{69, 3}, 1305},
    {{17, 37}, 1177},
    {{30, 3}, 193},
    {{9, 15}, 818},
    {{75, 95}, 977},
    {{86, 47}, 184},
    {{10, 12}, 1736},
    {{80, 27}, 1010},
    {{12, 10}, 1736},
    {{86, 1}, 1958},
    {{60, 12}, 1240},
    {{43, 71}, 683},
    {{91, 65}, 1519},
    {{33, 86}, 1649},
    {{62, 26}, 1773},
    {{1, 13}, 1187},
    {{2, 10}, 1018},
    {{91, 29}, 351},
    {{69, 12}, 136},
    {{43, 9}, 237},
    {{29, 86}, 258},
    {{17, 48}, 1807},
    {{31, 64}, 1928},
    {{68, 61}, 1936},
    {{76, 38}, 1724},
    {{1, 6}, 482},
    {{53, 14}, 355},
    {{51, 50}, 917},
    {{54, 13}, 815},
    {{19, 29}, 883},
    {{35, 87}, 974},
    {{70, 96}, 511},
    {{23, 35}, 589},
    {{39, 69}, 1588},
    {{93, 73}, 1093},
    {{13, 73}, 435},
    {{5, 60}, 1619},
    {{42, 41}, 1523},
    {{66, 58}, 1596},
    {{1, 67}, 431},
    {{17, 67}, 449},
    {{30, 95}, 906},
    {{71, 43}, 683},
    {{5, 87}, 190},
    {{12, 78}, 891},
    {{30, 97}, 402},
    {{28, 17}, 1131},
    {{7, 97}, 1356},
    {{58, 66}, 1596},
    {{20, 37}, 1294},
    {{73, 76}, 514},
    {{54, 8}, 613},
    {{68, 35}, 1252},
    {{92, 32}, 701},
    {{3, 90}, 652},
    {{99, 46}, 1576},
    {{13, 54}, 815},
    {{20, 87}, 1390},
    {{36, 18}, 1626},
    {{51, 26}, 1146},
    {{2, 23}, 581},
    {{29, 7}, 1558},
    {{88, 59}, 173},
    {{17, 1}, 1071},
    {{37, 49}, 1011},
    {{18, 6}, 696},
    {{88, 33}, 225},
    {{58, 38}, 802},
    {{87, 50}, 1744},
    {{29, 91}, 351},
    {{6, 71}, 1053},
    {{45, 24}, 1720},
    {{65, 91}, 1519},
    {{37, 50}, 203},
    {{11, 3}, 943},
    {{72, 65}, 1330},
    {{45, 50}, 339},
    {{25, 20}, 971},
    {{15, 9}, 818},
    {{14, 54}, 1353},
    {{69, 95}, 393},
    {{8, 66}, 1213},
    {{52, 2}, 1608},
    {{50, 14}, 690},
    {{50, 45}, 339},
    {{1, 37}, 1273},
    {{45, 93}, 1650},
    {{39, 78}, 313},
    {{1, 86}, 1958},
    {{17, 28}, 1131},
    {{35, 33}, 1667},
    {{23, 2}, 581},
    {{51, 66}, 245},
    {{17, 54}, 924},
    {{41, 49}, 1629},
    {{60, 5}, 1619},
    {{56, 93}, 1110},
    {{96, 13}, 461},
    {{25, 7}, 637},
    {{11, 69}, 370},
    {{90, 3}, 652},
    {{39, 71}, 1485},
    {{65, 51}, 1529},
    {{20, 6}, 1414},
    {{80, 85}, 270},
    {{73, 83}, 1162},
    {{0, 97}, 1303},
    {{13, 33}, 826},
    {{29, 71}, 1788},
    {{33, 12}, 461},
    {{12, 58}, 1273},
    {{69, 39}, 1588},
    {{67, 75}, 1504},
    {{87, 20}, 1390},
    {{88, 97}, 526},
    {{33, 88}, 225},
    {{95, 69}, 393},
    {{2, 52}, 1608},
    {{5, 25}, 719},
    {{34, 78}, 510},
    {{53, 99}, 1074},
    {{33, 35}, 1667},
    {{57, 30}, 361},
    {{87, 58}, 1574},
    {{13, 90}, 1030},
    {{79, 74}, 91},
    {{4, 86}, 1107},
    {{64, 94}, 1609},
    {{11, 12}, 167},
    {{30, 45}, 272},
    {{47, 91}, 561},
    {{37, 17}, 1177},
    {{77, 49}, 883},
    {{88, 23}, 1747},
    {{70, 80}, 995},
    {{62, 77}, 907},
    {{18, 4}, 371},
    {{73, 93}, 1093},
    {{11, 47}, 595},
    {{44, 23}, 1990},
    {{20, 0}, 512},
    {{3, 69}, 1305},
    {{82, 3}, 1815},
    {{20, 88}, 368},
    {{44, 45}, 364},
    {{26, 51}, 1146},
    {{7, 65}, 349},
    {{71, 39}, 1485},
    {{56, 88}, 1954},
    {{94, 69}, 1397},
    {{12, 28}, 544},
    {{95, 75}, 977},
    {{32, 90}, 789},
    {{53, 1}, 772},
    {{54, 14}, 1353},
    {{49, 77}, 883},
    {{92, 26}, 1344},
    {{17, 18}, 565},
    {{97, 88}, 526},
    {{48, 80}, 1203},
    {{90, 32}, 789},
    {{71, 6}, 1053},
    {{87, 35}, 974},
    {{55, 90}, 1808},
    {{12, 61}, 1791},
    {{1, 96}, 328},
    {{63, 10}, 1681},
    {{76, 34}, 871},
    {{41, 64}, 926},
    {{42, 97}, 482},
    {{25, 5}, 719},
    {{23, 65}, 1932},
    {{54, 1}, 1491},
    {{28, 12}, 544},
    {{89, 10}, 108},
    {{27, 33}, 143},
    {{67, 1}, 431},
    {{32, 45}, 52},
    {{79, 33}, 1871},
    {{6, 55}, 717},
    {{10, 58}, 459},
    {{67, 39}, 393},
    {{10, 4}, 1808},
    {{96, 6}, 481},
    {{1, 19}, 970},
    {{97, 7}, 1356},
    {{29, 16}, 1108},
    {{1, 53}, 772},
    {{30, 15}, 1125},
    {{4, 6}, 634},
    {{6, 20}, 1414},
    {{88, 56}, 1954},
    {{87, 64}, 1950},
    {{34, 76}, 871},
    {{17, 12}, 285},
    {{55, 59}, 321},
    {{61, 68}, 1936},
    {{50, 87}, 1744},
    {{84, 44}, 952},
    {{41, 33}, 993},
    {{59, 18}, 1352},
    {{33, 27}, 143},
    {{38, 32}, 1210},
    {{55, 70}, 1264},
    {{38, 58}, 802},
    {{1, 20}, 642},
    {{73, 13}, 435},
    {{80, 48}, 1203},
    {{94, 64}, 1609},
    {{38, 28}, 414},
    {{73, 23}, 1113},
    {{78, 12}, 891},
    {{26, 62}, 1773},
    {{87, 43}, 579},
    {{53, 6}, 95},
    {{59, 95}, 285},
    {{88, 63}, 1717},
    {{17, 5}, 633},
    {{66, 8}, 1213},
    {{41, 42}, 1523},
    {{83, 22}, 597},
    {{95, 30}, 906},
    {{51, 65}, 1529},
    {{17, 49}, 1727},
    {{64, 87}, 1950},
    {{86, 4}, 1107},
    {{37, 98}, 1102},
    {{32, 92}, 701},
    {{60, 94}, 198},
    {{73, 98}, 1749},
    {{4, 18}, 371},
    {{96, 70}, 511},
    {{7, 29}, 1558},
    {{35, 37}, 841},
    {{27, 64}, 384},
    {{12, 33}, 461},
    {{36, 38}, 529},
    {{69, 16}, 1183},
    {{91, 47}, 561},
    {{85, 29}, 1676},
    {{3, 82}, 1815},
    {{69, 58}, 1579},
    {{93, 45}, 1650},
    {{97, 42}, 482},
    {{37, 1}, 1273},
    {{61, 4}, 543},
    {{96, 1}, 328},
    {{26, 0}, 1993},
    {{70, 64}, 878},
    {{3, 30}, 193},
    {{58, 69}, 1579},
    {{4, 25}, 595},
    {{31, 3}, 1337},
    {{55, 6}, 717},
    {{39, 67}, 393},
    {{78, 34}, 510},
    {{75, 67}, 1504},
    {{6, 53}, 95},
    {{51, 79}, 175},
    {{28, 91}, 1040},
    {{89, 78}, 1828},
    {{74, 93}, 1587},
    {{45, 32}, 52},
    {{10, 2}, 1018},
    {{49, 37}, 1011},
    {{63, 61}, 845},
    {{0, 20}, 512},
    {{1, 17}, 1071},
    {{99, 53}, 1074},
    {{37, 20}, 1294},
    {{10, 89}, 108},
    {{33, 92}, 946},
    {{23, 73}, 1113},
    {{23, 88}, 1747},
    {{49, 17}, 1727},
    {{88, 20}, 368},
    {{21, 54}, 1870},
    {{70, 93}, 1582},
    {{59, 88}, 173},
    {{32, 38}, 1210},
    {{89, 59}, 89},
    {{23, 44}, 1990},
    {{38, 76}, 1724},
    {{30, 57}, 361},
    {{94, 60}, 198},
    {{59, 10}, 1558},
    {{55, 64}, 1996},
    {{12, 11}, 167},
    {{36, 24}, 1801},
    {{97, 30}, 402},
    {{52, 1}, 127},
    {{58, 87}, 1574},
    {{54, 17}, 924},
    {{93, 74}, 1587},
    {{24, 36}, 1801},
    {{2, 37}, 1451},
    {{91, 28}, 1040},
    {{59, 55}, 321},
    {{69, 11}, 370},
    {{8, 54}, 613},
    {{29, 85}, 1676},
    {{44, 19}, 1762},
    {{74, 79}, 91},
    {{93, 56}, 1110},
    {{58, 10}, 459},
    {{41, 50}, 1559},
    {{66, 51}, 245},
    {{80, 19}, 1838},
    {{33, 79}, 1871},
    {{76, 73}, 514},
    {{98, 37}, 1102},
    {{45, 44}, 364},
    {{16, 69}, 1183},
    {{49, 41}, 1629},
    {{19, 80}, 1838},
    {{71, 57}, 500},
    {{6, 4}, 634},
    {{64, 27}, 384},
    {{84, 86}, 1431},
    {{5, 17}, 633},
    {{96, 88}, 334},
    {{87, 5}, 190},
    {{70, 21}, 1619},
    {{55, 33}, 1391},
    {{10, 63}, 1681},
    {{11, 62}, 1339},
    {{33, 13}, 826},
    {{64, 70}, 878},
    {{65, 72}, 1330},
    {{70, 55}, 1264},
    {{64, 55}, 1996},
    {{50, 41}, 1559},
    {{46, 99}, 1576},
    {{88, 96}, 334},
    {{51, 20}, 868},
    {{73, 7}, 754},
    {{80, 70}, 995},
    {{44, 84}, 952},
    {{29, 19}, 883},
    {{59, 69}, 903},
    {{57, 53}, 1575},
    {{90, 13}, 1030},
    {{28, 38}, 414},
    {{12, 60}, 1240},
    {{85, 58}, 573},
    {{90, 55}, 1808},
    {{4, 10}, 1808},
    {{68, 44}, 1229},
    {{92, 33}, 946},
    {{90, 81}, 1024},
    {{53, 75}, 545},
    {{45, 30}, 272},
    {{41, 77}, 138},
    {{21, 70}, 1619},
    {{45, 73}, 1876},
    {{35, 68}, 1252},
    {{13, 96}, 461},
    {{53, 57}, 1575},
    {{82, 89}, 409},
    {{28, 61}, 449},
    {{58, 61}, 78},
    {{27, 80}, 1010},
    {{61, 58}, 78},
    {{38, 36}, 529},
    {{80, 30}, 397},
    {{18, 59}, 1352},
    {{62, 11}, 1339},
    {{95, 59}, 285},
    {{51, 98}, 1160},
    {{6, 18}, 696},
    {{30, 80}, 397},
    {{69, 94}, 1397},
    {{58, 85}, 573},
    {{48, 99}, 410},
    {{51, 46}, 213},
    {{57, 71}, 500},
    {{91, 30}, 104},
    {{65, 7}, 349},
    {{79, 51}, 175},
    {{47, 26}, 921},
    {{4, 61}, 543},
    {{98, 73}, 1749},
    {{74, 77}, 1277},
    {{61, 28}, 449},
    {{58, 8}, 1131},
    {{61, 45}, 1608},
    {{74, 87}, 934},
    {{71, 29}, 1788},
    {{30, 91}, 104},
    {{13, 1}, 1187},
    {{0, 26}, 1993},
    {{82, 49}, 1292},
    {{43, 87}, 579},
    {{24, 45}, 1720},
    {{20, 51}, 868},
    {{77, 62}, 907},
    {{82, 75}, 306},
  };

  for (unsigned i = 0; i < 10000; i++) {
    // Match how the swift version will be instantiating the graph list and edge
    // list for every iteration.
    std::vector<Node *> graph;
    for (unsigned Index : nodes) {
      graph.push_back(new Node(Index));
    }
    std::map<std::pair<unsigned, unsigned>, double> weight_map;
    for (auto P : edges) {
      weight_map[P.first] = P.second;
    }

    // Our closure uses our weight_map to look up the weight in between ndoeindex
    // and adj_node_index.
    std::vector<unsigned> TreeEdges;
    prims(graph, TreeEdges, [&weight_map] (unsigned ind1, unsigned ind2) -> double {
        return weight_map[{ind1, ind2}];
    });

    for (auto *n : graph)
      delete n;
  }

  return 0;
}
